package presenter

import (
	"net/http"

	"github.com/gin-gonic/gin"

	"BookStack/pkg/errors"
)

// Response 统一响应结构
type Response struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
	Error   interface{} `json:"error,omitempty"`
}

// Paged 分页响应结构
type Paged struct {
	Total     int64       `json:"total"`     // 总记录数
	PageSize  int         `json:"pageSize"`  // 每页数量
	Page      int         `json:"page"`      // 当前页码
	TotalPage int         `json:"totalPage"` // 总页数
	Items     interface{} `json:"items"`     // 分页数据
}

// ResponseFormatter 响应格式化器接口
type ResponseFormatter interface {
	// Success 成功响应
	Success(c *gin.Context, data interface{})

	// SuccessWithMessage 带消息的成功响应
	SuccessWithMessage(c *gin.Context, message string, data interface{})

	// Created 创建成功响应
	Created(c *gin.Context, data interface{})

	// NoContent 无内容响应
	NoContent(c *gin.Context)

	// Paged 分页响应
	Paged(c *gin.Context, items interface{}, total int64, page, pageSize int)

	// Error 错误响应
	Error(c *gin.Context, err error)

	// File 文件下载响应
	File(c *gin.Context, filePath, fileName string)
}

// responseFormatter 响应格式化器实现
type responseFormatter struct{}

// NewResponseFormatter 创建响应格式化器
func NewResponseFormatter() ResponseFormatter {
	return &responseFormatter{}
}

// Success 实现成功响应
func (r *responseFormatter) Success(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, Response{
		Code:    http.StatusOK,
		Message: "操作成功",
		Data:    data,
	})
}

// SuccessWithMessage 带消息的成功响应
func (r *responseFormatter) SuccessWithMessage(c *gin.Context, message string, data interface{}) {
	c.JSON(http.StatusOK, Response{
		Code:    http.StatusOK,
		Message: message,
		Data:    data,
	})
}

// Created 创建成功响应
func (r *responseFormatter) Created(c *gin.Context, data interface{}) {
	c.JSON(http.StatusCreated, Response{
		Code:    http.StatusCreated,
		Message: "创建成功",
		// Data:    data,
	})
}

// NoContent 无内容响应
func (r *responseFormatter) NoContent(c *gin.Context) {
	c.Status(http.StatusNoContent)
}

// Paged 分页响应
func (r *responseFormatter) Paged(c *gin.Context, items interface{}, total int64, page, pageSize int) {
	totalPage := int(total) / pageSize
	if int(total)%pageSize > 0 {
		totalPage++
	}

	c.JSON(http.StatusOK, Response{
		Code:    http.StatusOK,
		Message: "操作成功",
		Data: Paged{
			Total:     total,
			PageSize:  pageSize,
			Page:      page,
			TotalPage: totalPage,
			Items:     items,
		},
	})
}

// Error 统一错误响应
func (r *responseFormatter) Error(c *gin.Context, err error) {
	// 检查是否为应用错误
	if appErr, ok := err.(errors.AppError); ok {
		c.JSON(appErr.StatusCode(), Response{
			Code:    appErr.ErrorCode(),
			Message: appErr.Error(),
			Error:   appErr.Details,
		})
		return
	}

	// 默认服务器错误
	c.JSON(http.StatusInternalServerError, Response{
		Code:    errors.ErrCodeSystem,
		Message: "服务器内部错误",
		Error:   err.Error(),
	})
}

// File 文件下载响应
func (r *responseFormatter) File(c *gin.Context, filePath, fileName string) {
	c.Header("Content-Disposition", "attachment; filename="+fileName)
	c.File(filePath)
}
